Homicide Summary

Column

After declining from 2008, the number of homicides in London increased after 2014

The homicide rate per 100,000 population in London also increased after 2014

The median age for all London homicide victims is 30 (2008 to 2020)

Column

Homicide rates are highest in the centre of London - peaking at over 7 victims per 100,000 in City of London

Column

The number of black victims has grown sharply since 2014 (2008-2019)

Knives are the largest and most rapdily growing cause of homicide deaths (2008-2019)

By Gender and Age

Column

A higher proportion of male homicides are young (2008-2020)

There is a high concentration of male victims at a younger age with a mean age of 33 (2008-2020)

Column

There are large clusters of female victims near the centre of London (2008 - 2020)

Column

A higher proportion of black homicides are young (2008-2019)

77% of all homicide victims in London are male (2008-2019)

By Ethnicity and Cause of Death

Column

Black victims are younger than other victims (2008-2019)

Gun victims are younger than other victims (2008-2019)

Column

Homicides by ethnicity are spread across London but with a higher concentration of black victims in Eastern boroughs (2008-2020)

Column

Homicides involving black victims are less likely to get solved in the criminal justice system (2008-2020)

Homicides involving guns are also less likely to get solved in the criminal justice system (2008-2020)

---
title: "London Homicides 2008 to 2020"
author: "David Harrington"
output: 
  flexdashboard::flex_dashboard:
    social: menu
    source_code: embed
---

```{r global, include=FALSE}

library(flexdashboard)
library(knitr)
library(readxl)
library(ggplot2)
library(dplyr)
library(tidyr)
library(tibble)
library(stringr)
library(lubridate)
library(leaflet)
library(leaflet.extras)
library(tidyverse)
library(reshape)
library(ggridges)
library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)
library(htmlwidgets)
library(htmltools)
library(plotly)

    # data import
    
    library(readxl)
    mmap18 <- read_excel("mmap.xlsx")
    
    
    # clean up the orginal data set and eliminate redundant variables
    
    library(dplyr)
    mmap18 = select(mmap18, -6,-7,-8,-13,-14,-16,-17,-18,-19)
    
    # reorder columns
    mmap18 <- mmap18[ , c(2, 1, 8, 9,5,4,3,10,6,11,7)]  
    
    
    # update column names
    colnames(mmap18) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    # change strings to factors
    mmap18 <- mmap18 %>% mutate_if(is.character, as.factor) 
    
    # import the 2019 murder map data into R
    mmap19 <- read_excel("Murdermap2019.xlsx")
    
    mmap19 = select(mmap19, -3,-6)
    
    
    mmap19$longitude <- as.numeric(mmap19$longitude)
    
    
    # change strings to factors
    mmap19 <- mmap19 %>% mutate_if(is.character, as.factor) 
    
    colnames(mmap19) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    # import the 2019 murder map data into R
    mmap20 <- read_excel("Murdermap2020.xlsx")
    
    mmap20 = select(mmap20, -3,-6)
    
    mmap20 <- mmap20 %>% mutate_if(is.character, as.factor) 
    
    colnames(mmap20) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    
    ##Merge mmap19 and mmap 20 using rbind function
    mmap19_20 = rbind(mmap19,mmap20)
    
    #change the levels for "sex" to align with mmap18
    mmap19_20 <- mmap19_20 %>%
      mutate(sex = fct_recode(sex,
                              "M" = "Male",
                              "F" = "Female")) 
    
    # merge mmap19_20 with mmap18 to create mmap (integrated cases from 2008 to 2020)
    mmap = rbind(mmap18, mmap19_20)
    
    
    # See all levels in weapon variable
    levels(mmap$weapon) 
    
    # Replicate weapon column to enable re-factoring
    mmap2 = cbind(mmap, weapon2=rep(mmap$weapon)) 
    
    
    # Change levels in Weapon column to include just 4 levels Knife, Gun, Assault and Other
    mmap3 <- mmap2 %>% mutate( weapon = fct_recode(weapon,
                                                   "Other" = "Arson",
                                                   "Other" = "Vehicle",
                                                   "Other" = "Drug",
                                                   "Other" = "Poison",
                                                   "Other" = "Unknown",
                                                   "Other" = "Ligature",
                                                   "Other" = "Strangulation",
                                                   "Other" = "Fire",
                                                   "Other" = "Other",
                                                   "Other" = "Blunt Object",
                                                   "Assault" = "None"))
    
    
    
    # clean up the factor names within borough variable to enable the bind with boroughpop (ensure they are exactly the same!)
    mmap33 <- mmap3 %>% mutate(borough = fct_recode(borough, 
                                                    "Westminster" = "City of Westminster",
                                                    "Kingston upon Thames" = "Kingston-upon-Thames",
                                                    "Kingston upon Thames" = "Kingston Upon Thames",
                                                    "Kingston upon Thames" = "Kingston-Upon-Thames",
                                                    "Richmond upon Thames" = "Richmond"))
    
    
    # Replicate date column
    mmap4 = cbind(mmap33, date2=rep(mmap3$date))
    
    
    # create new data frame mmap5 and separate date variable from mmap4 into year, month and day and save them as integers
    mmap5 = separate(mmap4, date2, c("year", "month", "day"), "-") %>%
      mutate_if(is.character, as.integer) 
    
    mmap5 <- mmap5 %>% mutate(status2 = fct_recode(status, 
                                                   "Awaiting Trial" = "Awaiting trial",
                                                   "Awaiting Trial" = "Awaiting Outcome",
                                                   "Solved" = "Solved",
                                                   "Solved" = "Self Defence",
                                                   "Unsolved" = "Suspect dead",
                                                   "Unsolved" = "Unsolved"))
    
    
    
    mmap5 <- mmap5 %>% mutate(ethnicity = fct_recode(ethnicity, 
                                                     "Other" = "Mixed",
                                                     "Black" = "Black",
                                                     "Black" = "Black or Black British",
                                                     "White" = "White",
                                                     "White" = "White or White British",
                                                     "Asian" = "Asian",
                                                     "Asian" = "Asian or Asian British",
                                                     "Other" = "Unknown",
                                                     "Other" = "NA",
                                                     "Other" = "Any Other Ethnic Appearance"))
    
    levels(mmap5$ethnicity)
    
    # read the boroughpop file into R to access borough population data
    boroughpop <- read_excel("boroughpop.xlsx")
    
    
    # change column names in boroughpop
    colnames(boroughpop) = c("borough", "population")
    
    # join mmap5 and boroughpop data frames using "borough" 
    mmap6 <- left_join(mmap5, boroughpop, by = "borough")
    
    
    # make bourough a factor variable
    mmap6$borough <- as.factor(mmap6$borough)
    
    
    # create new variable for counting homicides by borough and homicides per 100,000 population by borough
    mmap6_sum <- mmap6 %>% select(borough, population) %>% group_by(borough) %>% mutate(count = n(), population = population, homicide_rate = (count*100000)/11/population) %>% distinct()
    
    # create mmap 7 by filtering mmap5 to just include full year data to end of calendar 2019
    mmap7 <- mmap6 %>% filter(year != "2020")
    
    
    mmap7 <-data.frame(mmap7)
    
    # remove NA cases for ethicity
    mmap8 <- mmap7 %>% filter(ethnicity != "NA")
    
    # save mmap6_sum as data frame and name the data frame mmap9                                                                               
    mmap9 <- as.data.frame(mmap6_sum)
    
    # create new data frame mmap10 with just borough and homicide rate variables
    mmap10 <- mmap9 %>% select(borough, homicide_rate)
    
    # round the homicide_rate variable to 2 decimal places
    mmap10$homicide_rate <- round(mmap10$homicide_rate, 2)
    
    # arrange the data frame based on homicide rate variable descending order
    mmap10 <- mmap10 %>% arrange(desc(mmap10$homicide_rate)) 
    
    
    mmap7$year <- as.factor(mmap7$year)   

    # calculate sum borough population based on the 2016 ONS data for boroughs
GreaterLondonPop <- sum(boroughpop$population)
GreaterLondonPop

# create vector for Greater London Population for 2008 to 2019
 GreaterLondonPopMillions <- c(7.8, 7.9, 8.0, 8.15, 8.25, 8.35, 8.5, 8.7, 8.82, 8.85, 8.9, 9.0)
 
# Greater London Population in 100,000s
GreaterLondon <- GreaterLondonPopMillions*10

# Greater London total homicides

LondonHomicides <- c(155, 130, 128, 121, 103, 113, 90, 120, 107, 130, 131, 149)

Year <- c(2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019)

# merge vectors into a data frame

London <- data.frame(Year, LondonHomicides, GreaterLondon)

London


# Number of homicides per 100,000 population, 2008-2019

LondonHomicideRate <- London %>% mutate(Homicide_Rate = LondonHomicides/GreaterLondon)

LondonHomicideRate$Homicide_Rate <- round(LondonHomicideRate$Homicide_Rate,2)

LondonHomicideRate$Year <- as.factor(LondonHomicideRate$Year)

str(LondonHomicideRate)

sex <- table(mmap5$sex) # Victim gender table
addmargins(sex) # Plus totals

# create new data frame to show ageGroup data by year
ageyear <- mmap7 %>% 
  select(ageGroup, year) %>%
  group_by(ageGroup, year) %>%
  tally() %>%
  spread(ageGroup, n) 


# calculate total homicides per ageGroup across 2008 to 2019
homicidesA <- sum(ageyear$`A. Child 0-6`, na.rm= TRUE)
homicidesB <- sum(ageyear$`B. Child 7-12`, na.rm= TRUE)
homicidesC <- sum(ageyear$`C. Teen 13-16`, na.rm= TRUE)
homicidesD <- sum(ageyear$`D. Teen 17-19`, na.rm= TRUE)
homicidesE <- sum(ageyear$`E. Adult 20-24`, na.rm= TRUE)
homicidesF <- sum(ageyear$`F. Adult 25-34`, na.rm= TRUE)
homicidesG <- sum(ageyear$`G. Adult 35-44`, na.rm= TRUE)
homicidesH <- sum(ageyear$`H. Adult 45-54`, na.rm= TRUE)
homicidesI <- sum(ageyear$`I. Adult 55-64`, na.rm= TRUE)
homicidesJ <- sum(ageyear$`J. Adult 65 over`, na.rm= TRUE)

# consolidate total homicides per ageGroup across 2008 to 2019 into a new vector homicides_ageGroup
homicides_ageGroup <- c(homicidesA, homicidesB, homicidesC, homicidesD, homicidesE, homicidesF, homicidesG, homicidesH, homicidesI, homicidesJ)

# create vector agegp with unique values for the variable "ageGroup" in mmap5
agegp <- unique(mmap5$ageGroup)

# refactor to order the values for the variable "ageGroup" from youngest to oldest
agegp <- factor(c("A. Child 0-6", "B. Child 7-12", "C. Teen 13-16", "D. Teen 17-19", "E. Adult 20-24", "F. Adult 25-34","G. Adult 35-44","H. Adult 45-54","I. Adult 55-64","J. Adult 65 over"))

# create vector to calculate average homicides per year over 11 years from 2008 to 2019
homicides_ageGroup_avg <- homicides_ageGroup/11

# create population vector by age group - Source: ONS small area population estimates mid-2016 (latest ONS survey for UK)
popn <- c(872040, 659384, 374989, 278134, 557975, 1654605, 1408946, 1151408, 828359, 1039161) 

# create homicide-rate2 vector
homicide_rate2  <- homicides_ageGroup_avg / popn * 100000 


# Create a data frame from vectors
mmap11 <- data.frame(agegp, round(homicide_rate2,2)) 

colnames(mmap11) <- c("Age_Group", "Homicide_Rate")

# calculate mean and median age for all homicides in London 2008-2020
meanAge <- mean(mmap5$age)
meanAge

medianAge <- median(mmap5$age)
medianAge

# Trends in Status

## create tables showing probability of being solved given weapon, ethnicity and borough

# by weapon type
status <- table(mmap5$weapon, mmap5$status, dnn = c("weapon", "status"))
status

statusProp <- prop.table(status, 1)
statusProp

# save as data frame
weaponStatus <- data.frame(statusProp)

# filter to just include probability of being solved
weaponStatus1 <- weaponStatus %>% filter(status == "Solved")

# change to percent
weaponStatus1$percent <- round(weaponStatus1$Freq,2)*100

mmap13 <- weaponStatus1 %>% arrange(weaponStatus1$percent)

mmap13$percent <- as.integer(mmap13$percent)


# by ethnicity

levels(mmap8$ethnicity)

status2 <- table(mmap8$ethnicity, mmap8$status, dnn = c("ethnicity", "status"))
status2

status2Prop <- round(prop.table(status2, 1),2)
status2Prop

# save as data frame
ethnicityStatus <- data.frame(status2Prop)


# filter to just include probability of being solved

ethnicityStatus1 <- ethnicityStatus %>% filter(status == "Solved")

# change to percent
ethnicityStatus1$percent <- round(ethnicityStatus1$Freq,2)*100

mmap14 <- ethnicityStatus1 %>% arrange(ethnicityStatus1$percent)

# by ageGroup

levels(mmap8$ageGroup)

status4 <- table(mmap8$ageGroup, mmap8$status, dnn = c("ageGroup", "status"))
status4

status4Prop <- round(prop.table(status4, 1),2)
status4Prop

# save as data frame
AgeGroupStatus <- data.frame(status4Prop)


# filter to just include probability of being solved

AgeGroupStatus1 <- AgeGroupStatus %>% filter(status == "Solved")

# change to percent
AgeGroupStatus1$percent <- round(AgeGroupStatus1$Freq,2)*100


# by location
status3 <- table(mmap5$borough, mmap5$status, dnn = c("borough", "status"))
status3

status3Prop <- prop.table(status3, 1)
status3Prop

# save as data frame
boroughStatus <- data.frame(status3Prop)

# filter to just include probability of being solved

boroughStatus1 <- boroughStatus %>% filter(status == "Solved")

# change to percent
boroughStatus1$percent <- round(boroughStatus1$Freq,2)*100


# Install ggplot2 mapping packages

library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)
library(rgdal)
library(leaflet)

# create Leaflet interactive cloropeth chart for Homicide Rate

# read shp file for just London boroughs

# find layer names
ogrListLayers("London_Borough_Excluding_MHW.shp")

# save shape file using readOGR
London_Borough =readOGR("London_Borough_Excluding_MHW.shp", layer="London_Borough_Excluding_MHW")

# convert coordinates into lat long degrees
proj4string(London_Borough) <- CRS("+init=epsg:27700")
London_Borough.wgs84 <- spTransform(London_Borough, CRS("+init=epsg:4326"))


# For Leaflet choropleth maps, we need to use a SpatialPolygonDataFrame

class(London_Borough.wgs84)
names(London_Borough.wgs84)

# Rename the borough variable in mmap10 to "NAME" to match the "SpatialPolygonsDataFrame" file London_Ward2.wgs84

names(mmap10)[names(mmap10) == "borough"] <- "NAME"

str(mmap10)

mmap10 <- mmap10 %>% mutate(NAME = fct_recode(NAME, 
                                                        
                             "City of London" = "City and County of the City of London",
                            
                           "Westminster" = "City of Westminster"))  

levels(mmap10$NAME)

# merge mmap data into London_Ward.wgs84 SpatialPolygonsDataFrame using "DISTRICT"
merge.mmap10 <- sp::merge(London_Borough.wgs84, mmap10, by = "NAME", duplicateGeoms = TRUE)

# create a discrete colour scale based on quantiles for five levels

bins <- quantile(
  mmap10$homicide_rate,
  probs = seq(0,1,.2), names = FALSE, na.rm = TRUE)
bins

# bins now contains five sequential colour levels so that 20 per cent of the data falls within each bin. The following histogram visualises the breaks used to create the scale.

ggplot(data = mmap10,
       aes(x = homicide_rate)) +
  geom_histogram(colour = "white", bins = 40) +
  geom_vline(
    xintercept = quantile(
      mmap10$homicide_rate,
      probs = seq(0,1,0.2), na.rm = TRUE),
    colour = "red", lwd = 1, lty = 2)



```
Homicide Summary {data-orientation=Column}
=======================================================================

Column {data-width=500}
-----------------------------------------------------------------------

### After declining from 2008, the number of homicides in London increased after 2014


```{r}

p1 <- ggplot(mmap7, aes(x = year)) +
  geom_bar(stat='count', fill = "navyblue", color = "white") +
  labs(x = "Year", y = "Homicides")+
  theme_minimal(base_size = 9)
ggplotly(p1)

```


### The homicide rate per 100,000 population in London also increased after 2014


```{r}

p3 <- ggplot(LondonHomicideRate, aes(x= Year, y=Homicide_Rate)) +
geom_bar(stat="identity", fill="navyblue", color = "white")+
  labs(x = "Year", y = "Rate")+
  theme_minimal(base_size = 9)
ggplotly(p3)

```

### The median age for all London homicide victims is 30 (2008 to 2020)

```{r}
p6 <- ggplot(mmap5, aes(x = age))+ 
  geom_density(fill = "red", alpha = 0.5)+ 
  geom_histogram(colour = "white", fill = "navyblue", aes(age, ..density..), alpha = 0.5, bins = 100)+
  labs(x = "Victim Age", y = "Density", size = 2)+
  geom_vline(xintercept= median(mmap7$age)) +
  annotate("text",label = "Mean = 34.6",x = 49, y = 0.04, colour = "red") +
  geom_vline(xintercept= mean(mmap7$age),linetype=2) +
  annotate("text",label = "Median = 30.0",x = 45, y = 0.035, colour = "red")+
  scale_x_continuous(limits = c(0, 100))+
   theme_minimal(base_size = 9)
ggplotly(p6)
```
```
```

Column {data-width=650}
-----------------------------------------------------------------------

### Homicide rates are highest in the centre of London - peaking at over 7 victims per 100,000 in City of London

```{r}
# add the colour scale to the choropleth map.
  pal <- colorBin(
    "YlOrRd",
    domain = mmap10$homicide_rate,
    bins = bins
  )

# add the colour scale to the choropleth map.
labels <- sprintf(
  "%s
%g homicide_rate",
  merge.mmap10$NAME,
  merge.mmap10$homicide_rate
) %>% lapply(htmltools::HTML)

title <- tags$div(
  HTML('

London Homicides

') ) p3 <- leaflet(merge.mmap10) %>% setView(lng = -0.118092 , lat = 51.509865, zoom = 9) p3 %>% addPolygons( fillColor = ~pal(homicide_rate), weight = 2, opacity = 0.5, color = "black", dashArray = "3", fillOpacity = 0.7, highlight = highlightOptions( weight = 5, color = "#0000FF", dashArray = "", fillOpacity = 0.7, bringToFront = TRUE), label = labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% addLegend(pal = pal, values = ~homicide_rate, opacity = 0.7, title = "Homicide Rate", position = "bottomright") %>% addControl(title, position = "topright") %>% setView(lng=-0.1, lat=51.51, zoom=10) %>% addProviderTiles("Esri.NatGeoWorldMap") ``` Column ----------------------------------------------------------------------- ### The number of black victims has grown sharply since 2014 (2008-2019) ```{r} p16 <- ggplot(mmap8, aes(x = year, fill = ethnicity)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2019)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Homicides", fill = "legend")+ theme_minimal(base_size = 9) ggplotly(p16) ``` ### Knives are the largest and most rapdily growing cause of homicide deaths (2008-2019) ```{r} p17 <- ggplot(mmap8, aes(x = year, fill = weapon)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2020)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Homicides", fill = "legend", size = 2)+ theme_minimal(base_size = 9) ggplotly(p17) ``` ``` ``` By Gender and Age {data-orientation=Column} ======================================================================= Column {data-width=550} ----------------------------------------------------------------------- ### A higher proportion of male homicides are young (2008-2020) ```{r} p9 <- ggplot(mmap5, aes(x = age, fill = sex)) + geom_density(alpha = 0.8)+ scale_fill_brewer(palette = "Set1")+ labs(fill = "Legend")+ scale_x_continuous("Victim Age")+ scale_y_continuous("Density")+ theme_minimal(base_size = 9) ggplotly(p9) ``` ### There is a high concentration of male victims at a younger age with a mean age of 33 (2008-2020) ```{r} p10 <- ggplot(data = mmap5, aes(x = sex, y = age)) + geom_boxplot(outlier.shape = NA) + geom_jitter(alpha = 1/5) + ylab("Age of Victim") + stat_summary(fun.y="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal(base_size = 9) ggplotly(p10) ``` ``` ``` Column {data-width=500} ----------------------------------------------------------------------- ### There are large clusters of female victims near the centre of London (2008 - 2020) ```{r} femaleVictims <- mmap5 %>% filter(sex == 'F') femaleVictims %>% # Map showing all point data leaflet() %>% setView(lng =-0.1, lat=51.51, zoom=10) %>% addProviderTiles(providers$Esri.NatGeoWorldMap) %>% addScaleBar %>% addCircleMarkers(lng = ~longitude, lat = ~latitude, popup = ~paste0("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", borough), radius = 5, clusterOptions = markerClusterOptions) ``` ``` ``` Column ----------------------------------------------------------------------- ### A higher proportion of black homicides are young (2008-2019) ```{r} p13 <- ggplot(mmap8, aes(x = age, fill = ethnicity)) + geom_density(alpha = 0.6)+ scale_fill_brewer(palette = "Set1")+ labs(fill = "Legend")+ scale_x_continuous("Victim Age")+ scale_y_continuous("Density")+ theme_minimal(base_size = 9) ggplotly(p13) ``` ### 77% of all homicide victims in London are male (2008-2019) ```{r} p18 <- ggplot(mmap8, aes(x = year, fill = sex)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2020)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Number of Homicides", fill = "legend")+ theme_minimal(base_size = 9) ggplotly(p18) ``` ``` ``` By Ethnicity and Cause of Death {data-orientation=Column} ======================================================================= Column {data-width=550} ----------------------------------------------------------------------- ### Black victims are younger than other victims (2008-2019) ```{r} p14 <- ggplot(data = mmap8, aes(x = reorder(ethnicity, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot() + geom_jitter(alpha = 1/5) + ylab("Age of victim") + xlab("Ethnicity")+ stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal(base_size = 10) ggplotly(p14) ``` ### Gun victims are younger than other victims (2008-2019) ```{r} p19 <- ggplot(data = mmap8, aes(x = reorder(weapon, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot() + geom_jitter(alpha = 1/5) + ylab("Age of victim") + xlab("Cause of Death")+ stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal(base_size = 10) ggplotly(p19) ``` ``` ``` Column {data-width=550} ----------------------------------------------------------------------- ### Homicides by ethnicity are spread across London but with a higher concentration of black victims in Eastern boroughs (2008-2020) ```{r} pal2 <- colorFactor(palette = c("darkgreen", "purple", "blue", "red"), levels = c("Black", "White", "Asian", "Other")) # Creating a 4 colour palette black <- mmap5 %>% filter(ethnicity == "Black") # Grouping layers - black white <- mmap5 %>% filter(ethnicity == "White") # Grouping layers - white asian <- mmap5 %>% filter(ethnicity == "Asian") # Grouping layers - asian other <- mmap5 %>% filter(ethnicity == "Other") # Grouping layers - other mmap5 %>% leaflet() %>% setView(lng=-0.1, lat=51.51, zoom=10) %>% addProviderTiles("Esri.NatGeoWorldMap") %>% addScaleBar(position = "bottomleft") %>% addCircleMarkers(data = black, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Black", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = white, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "White", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = asian, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Asian", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = other, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Other", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addLegend(position = "bottomright", pal = pal2, values = c("Black", "White", "Asian", "Other"), title = "Legend") %>% addLayersControl( overlayGroups = c("Black", "White", "Asian", "Other")) ``` ``` ``` Column ----------------------------------------------------------------------- ### Homicides involving black victims are less likely to get solved in the criminal justice system (2008-2020) ```{r} p23 <- ggplot(mmap14, aes(x= reorder(ethnicity, percent), y=percent))+ geom_bar(stat="identity", fill="navyblue", color = "black")+ coord_flip()+ labs(x = "Ethnicity", y = "Percent Solved")+ theme_minimal(base_size = 9) ggplotly(p23) ``` ### Homicides involving guns are also less likely to get solved in the criminal justice system (2008-2020) ```{r} p22 <- ggplot(mmap13, aes(x= reorder(weapon, percent), y=percent))+ geom_bar(stat="identity", fill="navyblue", color = "black")+ coord_flip()+ labs(x = "Cause of Death", y = "Percent Solved")+ theme_minimal(base_size = 9) ggplotly(p22) ```